#include "ModRunAdapter.h"
#include <QDebug>

#include "../Output/FactoryOutput.h"

#include "Gof23/Gof_Adapter/MoveOld.h"
#include "Gof23/Gof_Adapter/MoveAdapter.h"

//适配器模式的ModRun（Adapter）;
ModRunAdapter::ModRunAdapter()
{
    //模式名称;
    m_strModelName = "适配器模式（Adapter）;";
    //模式描述;
    m_strModelDesc = "适配器模式可以将一个类的接口转换成客户端希望的另一个接口，使得原来由于接口不兼容而不能在一起工作的那些类可以在一起工作。\n"
                     "通俗的讲就是当我们已经有了一些类，而这些类不能满足新的需求，\n"
                     "此时就可以考虑是否能将现有的类适配成可以满足新需求的类。适配器类需要继承或依赖已有的类，实现想要的目标接口。\n"
                     "\n"
                     "缺点：过多地使用适配器，会让系统非常零乱，不易整体进行把握。比如，明明看到调用的是 A 接口，\n"
                     "其实内部被适配成了 B 接口的实现，一个系统如果太多出现这种情况，无异于一场灾难。因此如果不是很有必要，\n"
                     "可以不使用适配器，而是直接对系统进行重构。\n"
                     ;
}

//初始化显示模式;
void ModRunAdapter::InitDisplay()
{
    qDebug() << m_strModelName;
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateDescOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outList{ m_strModelName,m_strModelDesc};
        pOutPut->OutPut(outList);
    }
}

//返回模式类型;
EnumModRun ModRunAdapter::GetEnum()
{
    return emModRunAdapter;
}

//运行模式;
void ModRunAdapter::ModRun()
{
    std::shared_ptr<IOutput> pOutPut = FactoryOutput::GetInstance()->CreateRunOutput();
    if (pOutPut)
    {
        std::initializer_list<QString> outListStart{ "========适配器模式 start:=======" };
        std::initializer_list<QString> outListEnd{ "========适配器模式 end:=======" };
        pOutPut->OutPut(outListStart);

        //适配器模式;
        std::shared_ptr<MoveOld> moveOld;
        std::shared_ptr<MoveAdapter> moveAdapter = std::make_shared<MoveAdapter>(moveOld);

        //调用适配器;
        moveAdapter->Request();
        
        pOutPut->OutPut(outListEnd);
    }

}

InterFaceModRun* ModRunAdapter::CreateMe()
{
    return new ModRunAdapter();
}
